package com.woniuxy.spring;

import com.woniuxy.Person;
import com.woniuxy.factories.FourthFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * @Author: 马宇航
 * @Todo: TODO
 * @DateTime: 01/17/0017 下午 2:07
 * @Component: 成都蜗牛学苑
 **/
public class BeanFactory {
    //<key,value>,通过key找到value?
    static Map<String, String> map = new HashMap();

    static {
        //1.读取配置文件
        Properties properties = new Properties();
        //2.获取一个InputStream，从beans.properties中的BeanFactory类获取=左边
        InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("beans.properties");
        //3.读取配置文件
        try {
            properties.load(resourceAsStream);
            //4. 获取配置文件中所有的key
            for (String key : properties.stringPropertyNames()) {
                //遍历后的key，来获取对应的value，这个value就是个全限定类名
                String property = properties.getProperty(key);
                //Person person = (Person) Class.forName(property).newInstance();
                //map.put(key,person);
                //创建多例，将key放入map中
                map.put(key, property);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param bean
     * @return com.woniuxy.Person
     * @Todo: 传入对应的类名首字母小写的，即可获取该对象
     * ChangeLog : 1. 创建 (01/17/0017 下午 2:11 [马宇航]);
     */
    public Person getBean(String bean) {
        //创建多例，从map中获得bean
        String name = map.get(bean);
        try {
            //通过bean创建实例，这是在方法中创建实例，实例在堆里，如果在static代码块中创建实例，是在类加载时创建实例，则只会创建一个实例
            return (Person) Class.forName(name).newInstance();
        }  catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }
}
